
## Snakes on a Payload
## Copyright (C) 2011 CORE Security Technologies
##
## This program is free software; you can redistribute it and/or
## modify it under the terms of the GNU General Public License
## as published by the Free Software Foundation; either version 2
## of the License, or (at your option) any later version.
##
## This program is distributed in the hope that it will be useful,
## but WITHOUT ANY WARRANTY; without even the implied warranty of
## MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
## GNU General Public License for more details.
##
## You should have received a copy of the GNU General Public License
## along with this program; if not, write to the Free Software
## Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.
##
## Authors:
## 2011/09/11 - Pedro Varangot (pvarangot@)
## 2011/09/11 - Fernando Russ (fruss@)



import StringIO
import struct
from relocation import Relocation

@Relocation.register
class R_X86_64_PC32(Relocation):
    NAME = "R_X86_64_PC32" # S + A - P
    def apply(self, section, output):       
        relocation_value = len(current_section) - self.offset + self.value + self.addend
        section[self.offset:self.offset+4:] = struct.pack("<I", relocation_value)

@Relocation.register
class R_X86_64_PLT32(Relocation):
    NAME = "R_X86_64_PLT32" # L + A - P


class R_X86_BaseRelocation(Relocation):
    def apply(self, section, output):       
        relocation_value = self.value + self.addend
        section[self.offset:self.offset+8:] = struct.pack("<Q", relocation_value)
       
@Relocation.register
class R_X86_64_64(R_X86_BaseRelocation):
    NAME = "R_X86_64_64" # pc + symbol_value + addend
    
@Relocation.register
class R_X86_64_RELATIVE(R_X86_BaseRelocation):
    NAME = "R_X86_64_RELATIVE" # B + A
    def parseSymbol(self, values): 
        return 0, int(values[0],16), ""
                
@Relocation.register
class R_X86_64_JUMP_SLO(R_X86_BaseRelocation):
    NAME = "R_X86_64_JUMP_SLO" # S   
@Relocation.register
class R_X86_64_GLOB_DAT(R_X86_BaseRelocation):
    NAME = "R_X86_64_GLOB_DAT" # S
